package com.mashibing.common.model;

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;

/**
 * @author SNA
 * @date 2025/5/7
 * @Description 在接口模块-策略模块-短信网关模块需要做校验和封装的POJO类对象
 **/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class StandardSubmit implements Serializable {

    // 针对当前短信的唯一标识 雪花算法
    private Long sequenceId;

    // 客户端id 基于apikey查询缓存模块得到客户的ID
    private Long clientId;

    // 客户端的ip白名单，查询缓存
    private List<String> ip;

    // 客户业务内的uid，客户请求传递的
    private String uid;

    // 目标手机号，客户请求传递的
    private String mobile;

    // 短信内容的签名，客户请求传递的，只需要在短信内容中基于【】获取出来
    private String sign;

    // 短信内容，客户请求传递的
    private String text;

    // 短信发送时间，当前系统时间
    @JsonSerialize(using = LocalDateTimeSerializer.class)
    @JsonDeserialize(using = LocalDateTimeDeserializer.class)
    private LocalDateTime sendTime;

    // 短信发送的费用，计算短信内容的文字，70个字一条，超过部分，67个字一条，单位：厘
    private Long fee;

    // 目标手机号的运营商id（策略模块）
    private Integer operatorId;

    // 目标手机号的归属地区号  0451  0455（策略模块，第三方网站查询不到，先不管）
    private Integer areaCode;

    // 目标手机号的归属地  如 哈尔滨（策略模块）
    private String area;

    // 通道下发的源号码 106934985673485645 （策略模块）
    private String srcNumber;

    // 通道的id （策略模块）
    private Long channelId;

    // 短信发送的状态  0:发送中  1:发送成功  2:发送失败，默认情况就是0
    private int reportState;

    // 短信发送失败的原因是什么，记录在当前属性中
    private String errorMsg;

    // =====================================================================
    // 获取到的客户端真实IP地址
    private String realIP;

    // 客户端请求携带的apikey
    private String apikey;

    // 短信类型，0:验证码短信  1:通知类短信  2:营销类短信
    private int state;

    //  签名的id
    private Long signId;

    // 是否携号转网，isTransfer = True，代表做了携号转网的判断并且做了操作
    private Boolean isTransfer = false;

    // 针对1小时限流规则存储的 系统时间毫秒值
    private Long oneHourLimitMilli;
    // 之后再做封装~~~

}
